Research Analysis Notebook

Authors
Affiliations

University of Oregon

Jenifer Bratter

Rice University

This research notebook analyzes the data and models estimated for multiracial intermarriage.

Code
get_coefs <- function(x) {
  temp <- coef(x)[,c(1,2)]
  return(tibble(variable=rownames(temp), coef=temp[,1], se=temp[,2]))
}

coef_short_sym <- get_coefs(model_short_sym) |>
  filter(str_detect(variable, "race_exog")) |>
  mutate(variable=str_replace(variable, "race_exog_short_sym",""))

coef_short_asym <- get_coefs(model_short_asym) |>
  filter(str_detect(variable, "race_exog_short_asym")) |>
  mutate(variable=str_replace(variable, "race_exog_short_asym",""))

coef_full <- get_coefs(model_full_sym_multi) |>
  filter(str_detect(variable, "race_exog_full")) |>
  mutate(variable=str_replace(variable, "race_exog_full_sym",""))

coef_multi <- coef_short_sym |>
  filter(str_detect(variable, "Multi/Multi"))

Raw differences in partner selection

We begin by just looking at the raw differences in partner selection among multiracial respondents.

Code
couples <- mar_markets[[1]] |> filter(choice)

husbands <- couples |>
  mutate(race_ego=raceh, 
         race_spouse=racew,
         gender="husband") |>
  select(race_ego, race_spouse, gender)
wives <- couples |>
  mutate(race_ego=racew, 
         race_spouse=raceh,
         gender="wife") |>
  select(race_ego, race_spouse, gender)

partner_choice <- bind_rows(husbands, wives) |>
  mutate(race_spouse=factor(race_spouse, 
                            levels=c("White","Black","Indigenous","Asian",
                                     "Latino","White/Black","White/Indigenous",
                                     "White/Asian","Black/Indigenous",
                                     "Black/Asian","Indigenous/Asian")))
Code
partner_choice |>
  filter(str_detect(race_ego, "/")) |>
  mutate(race_ego=factor(race_ego, 
                         levels=c("White/Asian","White/Indigenous","White/Black",
                                  "Indigenous/Asian","Black/Asian","Black/Indigenous"))) |>
  ggplot(aes(x=fct_rev(race_spouse), y=after_stat(prop), group=race_ego, 
             fill=race_ego))+
  geom_bar(position="dodge")+
  scale_y_continuous(labels=scales::percent)+
  scale_fill_manual(values = pnw_palette("Bay", 6))+
  labs(x="Race of other partner", y=NULL, fill="Race of ego partner")+
  coord_flip()+
  theme_bw()
Figure 1: Distribution of other partner’s race for multiracial respondents

Unsurprisingly, for all but one multiracial group (Black/Indigenous) the most common partner race is White, which is primarily a function of group size. However, it is clear that the part-White multiracial groups have a substantially higher likelihood of being with a White partner than the non part-White multiracial groups.

By the same token, the probability of marrying another multiracial partner is low because these groups are small in the overall population. Nonetheless, we do see spikes in each of these cases for intermarriage with the exact same multiracial group, suggesting substantial endogamy among these multiracial groups.

Lets look at these same numbers in a different way by panelizing the results for each multiracial group.

Code
partner_choice |>
  filter(str_detect(race_ego, "/")) |>
  ggplot(aes(x=fct_rev(race_spouse), y=after_stat(prop), group=1))+
  geom_bar(position="dodge")+
  facet_wrap(~race_ego)+
  scale_y_continuous(labels=scales::percent)+
  scale_color_viridis_d(direction=-1, end=0.75)+
  labs(x=NULL, y=NULL)+
  coord_flip()+
  theme_bw()
Figure 2: Distribution of partner’s race for multiracial respondents, separately by panel

Two things stand out a little more clearly in Figure 2 here to me:

  1. There is a tendency for each constituent group to be higher, although this can be sometimes tricky to see because of group size differences.
  2. Latino is high for everybody.

Now lets do this same figure for all racial groups but separately by gender.

Code
ggplot(partner_choice,
       aes(x=fct_rev(race_spouse), y=after_stat(prop), group=gender, fill=gender))+
  geom_bar(position="dodge")+
  facet_wrap(~race_ego)+
  scale_y_continuous(labels=scales::percent)+
  scale_fill_viridis_d(direction=-1, end=0.75)+
  labs(x=NULL, y=NULL)+
  coord_flip()+
  theme_bw()
Figure 3: Distribution of partner’s race for all respondents, separately by gender and race of ego respondent

The data for part-black multiracial individuals are generally consistent with the gender pattern for black individuals - part-Black men are more likely to outmarry, particularly with Whites. For part-Asian individuals who are not also part-Black, the gender pattern seems consistent with that for Asian individuals - women are more likely than men to outmarry with Whites and less likely to marry endogamously. Its notable that the Black/Asian pattern tends to follow the Black pattern. However, its not surprising that Blackness trumps everything else.

I also want to try a panel model that adds some color, although its a little tricky to get conditional distributions in dplyr.

Code
partner_choice |>
  filter(str_detect(race_ego, "/")) |>
  group_by(race_ego, race_spouse) |>
  summarize(n = n()) |>
  pivot_wider(id_cols = race_ego, names_from = race_spouse, values_from = n,
              names_prefix = "n_") |>
  ungroup() %>%
  mutate(total = rowSums(select(., starts_with("n_")))) |>
  pivot_longer(cols=starts_with("n_"), names_prefix="n_", names_to="race_spouse",
               values_to = "n") |>
  mutate(prop = n/total,
         race_ego = as.character(race_ego),
         spouse_multi = str_detect(race_spouse, "/"),
         spouse_const1 = str_split(race_spouse, "/", simplify = TRUE)[,1],
         spouse_const2 = str_split(race_spouse, "/", simplify = TRUE)[,2],
         overlap = case_when(
           race_ego == race_spouse ~ "Perfect overlap (endogamy)",
           !spouse_multi & str_detect(race_ego, race_spouse) ~ "Partial overlap",
           spouse_multi & 
             (str_detect(race_ego, spouse_const1) | 
                str_detect(race_ego, spouse_const2)) ~ "Partial overlap",
           TRUE ~ "No overlap"
         ),
         overlap = factor(overlap,
                          levels=c("No overlap", "Partial overlap",
                                   "Perfect overlap (endogamy)")),
         race_spouse=factor(race_spouse, 
                            levels=c("White","Black","Indigenous","Asian",
                                     "Latino","White/Black","White/Indigenous",
                                     "White/Asian","Black/Indigenous",
                                     "Black/Asian","Indigenous/Asian")),
         race_ego = factor(race_ego,
                           levels = c("White/Asian", "White/Indigenous", "White/Black",
                                      "Black/Asian", "Black/Indigenous", "Indigenous/Asian"))) |>
  ggplot(aes(x = fct_rev(race_spouse), y = prop, fill=overlap))+
  geom_col()+
  facet_wrap(~race_ego)+
  scale_fill_viridis_d(direction = -1, end=0.75)+
  scale_y_continuous(labels = scales::percent)+
  coord_flip()+
  labs(x="race of other spouse", y="percent")+
  theme_bw()
Figure 4: Distribution of partner’s race for multiracial spouses, separately for each multiracial group.

Multiracial-to-multiracial intermarriage

Ok, now lets move to the actual model results. The first thing we want to explore is multiracial-to-multiracial intermarriage. To analyze this, we use a model that fits gender-symmetric dummies for every single multiracial-to-multiracial exogamous union. This model was difficult to fit on the full data because the size of these cells is so small, resulting in some convergence problems in the model. To resolve this issue, we created separate marriage market data only using multiracial individuals to estimate the full terms. If the models only included the racial exogamy terms, then this model would give use identical results to a model with the full data. However, because we will get slightly different estimates on the control variables in this model versus the full model, the results will differ slightly. However, they should be sufficiently close to allow us to determine a more reduced form multiracial-to-multiracial coding we can use in the full data models.

Figure 5 below shows the odds ratios of outmarriage to each other multiracial group for each ego multiracial group, separately by panel.

Code
# the somewhat odd regular expression \\..*/ will identify all the names with a 
# period followed by some characters followed by a forward slash. This will give
# me all cases of a single race/multiple race marriage
temp <- coef_full |>
  filter(str_detect(variable, "/.*\\.*/")) |>
  mutate(race_ego=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_choice=str_split(variable, "\\.", simplify=TRUE)[,2],
         race_cons1=str_split(race_ego, "/", simplify=TRUE)[,1],
         race_cons2=str_split(race_ego, "/", simplify=TRUE)[,2],
         overlap=str_detect(race_choice, race_cons1) | 
           str_detect(race_choice, race_cons2),
         overlap = factor(overlap, 
                              levels = c(FALSE, TRUE),
                              labels = c("No overlap", "Partial overlap"))) |>
  select(race_ego, race_choice, overlap, coef, se)
         
# this needs to be duplicated so that each possibility is both ego and choice.
# easiest way to do this is to create a second one, flip the variables and 
# bind them together
temp2 <- temp
temp <- temp2 |>
  mutate(race_ego=temp$race_choice,
         race_choice=temp$race_ego) |>
  bind_rows(temp) |>
  mutate(race_ego=factor(race_ego, 
                         levels=c("White/Asian","Black/Asian",
                                  "White/Indigenous","Black/Indigenous",
                                  "White/Black","Indigenous/Asian")),
         race_choice=factor(race_choice, 
                         levels=c("White/Asian","Black/Asian",
                                  "White/Indigenous","Black/Indigenous",
                                  "White/Black","Indigenous/Asian")))


ggplot(temp, aes(x=race_choice, y=exp(coef), color=overlap))+
  geom_linerange(linewidth=1.25, 
                 aes(ymax=exp(coef+1.386*se), ymin=exp(coef-1.386*se)))+
  geom_linerange(linewidth=0.5, 
                 aes(ymax=exp(coef+1.96*se), ymin=exp(coef-1.96*se)))+
  geom_point(size=2)+
  geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  coord_flip()+
  facet_wrap(~race_ego, ncol=2)+
  scale_color_viridis_d(direction=-1, end=0.75)+
  labs(x="multiple race partner", 
       y="odds of marriage with multiple race partner relative to multiracial endogamy",
       color="overlap")+
  theme_bw()
Figure 5: Odds of interracial marriage with other multiracial groups for each multiracial group. The purple dots indicate cases where the ego multiracial group has overlapping partial ancestry with the other multiracial group, while the green dots indicate cases where is no overlap. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy (e.g. White/Black person marrying White/Black person).

As expected, some of the confidence intervals are pretty large because we have smaller samples of these types of marriages. I notice two things:

  1. None of these odds ratios are particularly high. The point estimates never break the 0.25 level. Below, we will calculate some of these same odds for multiracial-to-monoracial and for monoracial-to-monoracial. These odds are consistent with some of the higher monoracial-to-monoracial odds ratios but not outstanding. Thus, there is no evidence of breaking through to some sort of post-racial multiracial eve utopia here. Race still matters even if in combination.
  2. The results tend to show that when the two multiracial partners have a partial overlap in ancestry (e.g. White/Asian and White/Black share White), as indicated by the coloring, the odds tend to be higher.

To get another view of the results, lets line them all up from highest to lowest on the same plot.

Code
coef_full |>
  mutate(race_ego=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_choice=str_split(variable, "\\.", simplify=TRUE)[,2],
         race_cons1=str_split(race_ego, "/", simplify=TRUE)[,1],
         race_cons2=str_split(race_ego, "/", simplify=TRUE)[,2],
         overlap=str_detect(race_choice, race_cons1) | 
           str_detect(race_choice, race_cons2),
         overlap = factor(overlap, 
                              levels = c(FALSE, TRUE),
                              labels = c("No overlap", "Partial overlap")),
         variable=str_replace(variable, "\\.","+")) |>
  ggplot(aes(x=reorder(variable, coef, max), y=exp(coef), color=overlap))+
  geom_linerange(linewidth=1.25, 
                 aes(ymax=exp(coef+1.386*se), ymin=exp(coef-1.386*se)))+
  geom_linerange(linewidth=0.5, 
                 aes(ymax=exp(coef+1.96*se), ymin=exp(coef-1.96*se)))+
  geom_point(size=2)+
  geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  coord_flip()+
  scale_color_viridis_d(direction=-1, end=0.75)+
  labs(x=NULL, 
       y="odds of exogamous marriage with multiple race partner relative to multiracial endogamy",
       color="partial overlap")+
  theme_bw()
Figure 6: Odds of interracial marriage with other multiracial groups for each multiracial group, ordered from highest to lowest. The purple dots indicate cases where the ego multiracial group has overlapping partial ancestry with the other multiracial group, while the green dots indicate cases where is no overlap. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy (e.g. White/Black person marrying White/Black person). The dashed colored lines indicate the results from a model with two parameters for shared and not shared ancestry.

The three non-overlapping cases are at the bottom, although Black/Indigenous+Indigenous/Asian is also there (with huge error bars). A simple way to reduce the terms for this part of the model would just be to separate non-overlapping from overlapping cases, which would reduce us from 15 terms to 2 terms. Although there is some substantial variation in addition to this, I cannot see a simple pattern that could account for it, especially with the error bars.

Code
bic_diff <- mean(model_short_sym_multi$bic) - mean(model_full_sym_multi$bic)

To test this out, we tried an alternate model which reduced all of these specific parameters to two parameters: a multiracial-to-multiracial intermarriage with no shared ancestry and a multiracial-to-multiracial intermarriage with shared ancestry. The BIC statistic was -57.5433383 lower in this more parsimonious model indicating a strong preference for this model over the full model. According to this model, the odds relative to endogamy of an interracial marriage with a multiracial partner with partial overlap are 0.183. The corresponding relative odds for a multiracial partner without partial overlap are 0.043. The difference between these two parameters is highly statistically significant. Partial overlap is important, but partial overlap is still far less likely to lead to a union than full overlap.

Multiracial-to-monoracial intermarriage

Figure 7 shows the odds of intermarriage between each multiracial group and each single race group. For reference, I also draw lines indicating the reduced form odds of intermarriage between multiracial groups (shared vs. no shared ancestry).

Code
# the somewhat odd regular expression \\..*/ will identify all the names with a 
# period followed by some characters followed by a forward slash. This will give
# me all cases of a single race/multiple race marriage
coef_short_sym |>
  filter(str_detect(variable, "\\..*/")) |>
  mutate(single_race=str_split(variable, "\\.", simplify=TRUE)[,1],
         multiple_race=str_split(variable, "\\.", simplify=TRUE)[,2],
         constituent=str_detect(multiple_race, single_race),
         single_race=factor(single_race, 
                            levels=c("Latino","Asian","Indigenous",
                                     "Black","White")),
         multiple_race=factor(multiple_race,
                              levels=c("White/Asian","Black/Asian",
                                       "White/Indigenous","Black/Indigenous",
                                       "White/Black","Indigenous/Asian")),
         constituent = factor(constituent, 
                              levels = c(FALSE, TRUE),
                              labels = c("No overlap", "Partial overlap")),
         upper84=exp(coef+1.386*se),
         upper95=exp(coef+1.96*se),
         lower84=exp(coef-1.386*se),
         lower95=exp(coef-1.96*se)) |>
  ggplot(aes(x=single_race, y=exp(coef), color=constituent))+
  geom_hline(data=coef_multi, aes(yintercept=exp(coef), linetype=variable),
             color="red")+
  geom_linerange(linewidth=1.25, 
                  aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5, 
                  aes(ymax=upper95, ymin=lower95))+
  geom_point(size=2)+
  geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  coord_flip()+
  facet_wrap(~multiple_race, ncol=2)+
  scale_color_viridis_d(direction=-1, end=0.75)+
  labs(x="single race partner", 
       y="odds of marriage with single race partner relative to multiracial endogamy",
       color = "overlap")+
  theme_bw()
Figure 7: Odds of interracial marriage with single race groups for each multiracial group. The purple dots indicate cases where the single race group is constituent of the multiracial group, while the green dots indicate cases where the single race group is not constituent of the multiracial group. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively. The orange dashed line indicates the odds of intermarriage to a multiracial individual with no shared ancestry and the blue dashed line indicates the odds of intermarriage to a multiracial individual with shared ancestry. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy.

A few things I note about Figure 7:

  1. Latinos have a high rate of intermarriage with all the multiracial groups. This is not accounted for simply by multiple vs. single race Latinos.
  2. Notwithstanding (1), the constituent cases tend of have higher odds. This is most obvious in the case of White/Asian and White/Black partners. The two deviations from this are:
  • White/Indigenous - the odds of intermarriage with an Indigenous person are as low as the odds for Blacks and Asians.
  • Indigenous/Asians - again the odds of intermarriage with an Indigenous person are relatively low and the odds of intermarriage with a White person is the highest. However, this group is also the noisiest because it is the smallest.
  1. For most groups the odds of multiracial-to-multiracial intermarriage with shared ancestry are close to the odds for the highest single race group, but not substantially higher. For White/Asians, they are substantially lower.

fig-odds-ratios-latino takes a closer look at the results for Latinos.

Code
coef_short_sym |>
  filter(str_detect(variable, "Latino")) |>
  mutate(
    variable=str_replace(variable, "Latino",""),
    variable=str_replace(variable, "\\.", ""),
    type=case_when(
      str_count(variable, "/")>0 ~ "Multiracial partner",
      TRUE ~ "Monoracial partner"),
    upper84=exp(coef+1.386*se),
    upper95=exp(coef+1.96*se),
    lower84=exp(coef-1.386*se),
    lower95=exp(coef-1.96*se)) |>
  filter(variable!="") |>
  ggplot(aes(x=reorder(variable, coef, max), y=exp(coef), color=type))+
  geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  geom_point()+
  geom_linerange(linewidth=1.25, 
                  aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5, 
                  aes(ymax=upper95, ymin=lower95))+
  scale_color_viridis_d(direction=-1, end=0.75)+
  labs(x="Race of non-Latino partner",
       y="odds of intermarriage for Latino partners relative to endogamy",
    color="non-latino partner", shape="Latino partner")+
  coord_flip()+
  theme_bw()
Figure 8: Odds of interracial marriage with single and multiracial race groups for Latinos. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy.
Code
temp <- coef_short_sym |>
  filter(!str_detect(variable, "/")) |> 
  mutate(race1=str_split(variable, "\\.", simplify=TRUE)[,1],
         race2=str_split(variable, "\\.", simplify=TRUE)[,2])

temp <- temp |>
  mutate(race_temp = race1, 
         race1 = race2, 
         race2 = race_temp) |>
  select(variable, coef, se, race1, race2) |>
  bind_rows(temp) |>
  mutate(upper84=exp(coef+1.386*se),
         upper95=exp(coef+1.96*se),
         lower84=exp(coef-1.386*se),
         lower95=exp(coef-1.96*se))
  

temp |>
  filter(race1 != "Latino") |>
  mutate(race1 = factor(race1, 
                        levels = c("Black", "Indigenous", "Asian", "White")),
         race2 = factor(race2, 
                        levels = c("Latino","Asian","Indigenous","Black",
                                   "White"))) |>
  ggplot(aes(x = race1, y = exp(coef), color = race2))+
  geom_point(size = 2)+
  geom_linerange(linewidth=1.25, 
                 aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5, 
                 aes(ymax=upper95, ymin=lower95))+
  scale_color_viridis_d(direction = -1, end = 0.9)+
  labs(x = "race of other partner", 
       y = "odds of intermarriage for focal partner relative to endogamy",
       color = "race of focal partner")+
  coord_flip()+
  theme_bw()
Figure 9: Odds of interracial marriage across all monoracial groups. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively.

Aside from intermarriage with whites, Latino intermarriage is more likely to most non-Latino multiracial groups than non-Latino single race groups.

To get at potentially gender differences, Figure 10 displays a similar graph but with separate results depending on the gender combination from a model that allows for gender asymmetry.

Code
# before period is husband, after period is wife
temp <- coef_short_asym |>
  filter(str_detect(variable, "/") & 
           !str_detect(variable, "Multi/Multi|Latino")) |>
  mutate(race_husband=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_wife=str_split(variable, "\\.", simplify=TRUE)[,2],
         race_label=ifelse(str_detect(race_husband, "/"), 
                           paste(race_wife, " Female", 
                                 sep=""),
                           paste(race_husband, " Male", 
                                 sep="")),
         multiple_race=ifelse(str_detect(race_husband, "/"), race_husband,
                            race_wife),
         single_race=ifelse(str_detect(race_husband, "/"), race_wife,
                            race_husband),
         race_group=paste(single_race, ".", multiple_race, sep=""),
         single_race=factor(single_race, 
                            levels=c("Latino","Asian","Indigenous",
                                     "Black","White")),
         multiple_race=factor(multiple_race,
                              levels=c("White/Asian","Black/Asian",
                                       "White/Indigenous","Black/Indigenous",
                                       "White/Black","Indigenous/Asian")),
         upper84=exp(coef+1.386*se),
         upper95=exp(coef+1.96*se),
         lower84=exp(coef-1.386*se),
         lower95=exp(coef-1.96*se)) |>
  arrange(multiple_race, single_race, race_label)

temp |>
  ggplot(aes(x=fct_inorder(race_label), y=exp(coef), color=single_race))+
  #geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  geom_linerange(linewidth=1.25, 
                 aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5, 
                 aes(ymax=upper95, ymin=lower95))+
  geom_point(size=2)+
  coord_flip()+
  facet_wrap(~multiple_race, ncol=2)+
  scale_color_viridis_d(direction=-1, end=0.9)+
  theme_bw()+
  labs(color="Single race partner",
       x="single race partner", 
       y="odds of marriage with single race partner relative to multiracial endogamy")
Figure 10: Odds of interracial marriage with single race groups for each multiracial group, separately by the gender combination of the partners. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy.
Code
# before period is husband, after period is wife

temp <- coef_short_asym |>
  filter(str_detect(variable, "^Black\\.|\\.Black$") &
           !str_detect(variable, "/") &
           !str_detect(variable, "Multi/Multi|Latino")) |>
  mutate(race_husband=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_wife=str_split(variable, "\\.", simplify=TRUE)[,2],
         ego_race = "Black",
         alt_race = ifelse(str_detect(race_husband, "Black"), race_wife,
                            race_husband),
         race_label=ifelse(str_detect(race_husband, "Black"), 
                           paste(race_wife, " Female", 
                                 sep=""),
                           paste(race_husband, " Male", 
                                 sep="")))

temp <- coef_short_asym |>
  filter(str_detect(variable, "^Asian\\.|\\.Asian$") &
           !str_detect(variable, "/") &
           !str_detect(variable, "Multi/Multi|Latino")) |>
  mutate(race_husband=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_wife=str_split(variable, "\\.", simplify=TRUE)[,2],
         ego_race = "Asian",
         alt_race = ifelse(str_detect(race_husband, "Asian"), race_wife,
                            race_husband),
         race_label=ifelse(str_detect(race_husband, "Asian"), 
                           paste(race_wife, " Female", 
                                 sep=""),
                           paste(race_husband, " Male", 
                                 sep=""))) |>
  bind_rows(temp)

temp <- coef_short_asym |>
  filter(str_detect(variable, "^White/Black\\.|\\.White/Black$") &
           !str_detect(variable, "Multi/Multi|Latino")) |>
  mutate(race_husband=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_wife=str_split(variable, "\\.", simplify=TRUE)[,2],
         ego_race = "White/Black",
         alt_race = ifelse(str_detect(race_husband, "White/Black"), race_wife,
                            race_husband),
         race_label=ifelse(str_detect(race_husband, "White/Black"), 
                           paste(race_wife, " Female", 
                                 sep=""),
                           paste(race_husband, " Male", 
                                 sep=""))) |>
  bind_rows(temp)

temp <- coef_short_asym |>
  filter(str_detect(variable, "^White/Asian\\.|\\.White/Asian$") &
           !str_detect(variable, "Multi/Multi|Latino")) |>
  mutate(race_husband=str_split(variable, "\\.", simplify=TRUE)[,1],
         race_wife=str_split(variable, "\\.", simplify=TRUE)[,2],
         ego_race = "White/Asian",
         alt_race = ifelse(str_detect(race_husband, "White/Asian"), race_wife,
                            race_husband),
         race_label=ifelse(str_detect(race_husband, "White/Asian"), 
                           paste(race_wife, " Female", 
                                 sep=""),
                           paste(race_husband, " Male", 
                                 sep=""))) |>
  bind_rows(temp)

temp <- temp |>
  mutate(upper84=exp(coef+1.386*se),
         upper95=exp(coef+1.96*se),
         lower84=exp(coef-1.386*se),
         lower95=exp(coef-1.96*se),
         ego_race = factor(ego_race,
                           levels = c("White/Asian", "Asian", 
                                      "White/Black", "Black")),
         race_label = factor(race_label,
                             levels = c("Indigenous Female", "Indigenous Male",
                                        "Asian Female", "Asian Male",
                                        "Black Female", "Black Male",
                                        "White Female", "White Male")))

temp |>
  ggplot(aes(x=factor(race_label), y=exp(coef), color=alt_race))+
  #geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  geom_linerange(linewidth=1.25, 
                 aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5, 
                 aes(ymax=upper95, ymin=lower95))+
  geom_point(size=2)+
  coord_flip()+
  facet_wrap(~ego_race, ncol=2)+
  scale_color_viridis_d(direction=-1, end=0.9)+
  theme_bw()+
  labs(color="Single race partner",
       x="single race partner", 
       y="odds of marriage with single race partner relative to multiracial endogamy")
Figure 11: Odds of interracial marriage with single race groups separately by gender for White/Asian, White/Black, White, and Black spouses. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy.

What do we note from Figure 10?

  1. For all part-Black individuals, the pattern is like that for single race Black individuals. part-Black male/non-Black female pairings are more likely than vice versa, and correspondingly unions between part-Black female/Black male are more common than vice versa. This is easiest to see for the White/Black case. This implies that with regard to gender dynamics, the one-drop rule operates for people of part-Black ancestry.
  2. We don’t really see the same for people of part-Asian ancestry. It is marginally more likely to see White/Asian female+White male pairings than vice versa but the difference is not statistically significant. Furthermore, White/Asians have the same gendered pattern of intermarriage with Asians as other groups - women less likely to marry an Asian male and more likely to marry an Asian female. This suggests more flexibility in how partially Asian people are treated on the marriage market.

Monoracial-to-monoracial intermarriage

We don’t care as much about the monoracial-to-monoracial comparisons, but lets go ahead and plot those out since we have them.

Code
coef_short_sym |>
  filter(!str_detect(variable, "/")) |> 
  mutate(variable=str_replace(variable, "\\.","+"),
         upper84=exp(coef+1.386*se),
         upper95=exp(coef+1.96*se),
         lower84=exp(coef-1.386*se),
         lower95=exp(coef-1.96*se)) |>
  ggplot(aes(x=reorder(variable, coef, max), y=exp(coef)))+
  geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  geom_linerange(linewidth=1.25, color="grey20",
                 aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5, color="grey20",
                 aes(ymax=upper95, ymin=lower95))+
  geom_point(color="grey20")+
  coord_flip()+
  theme_bw()+
  labs(x=NULL, 
       y="odds of interracial union relative to endogamy")
Figure 12: Odds of interracial marriage between single race groups. 83.4% and 95% confidence intervals are shown for each estimate with thick and thin bars, respectively. The grey line indicates the case of an odds equal to one, meaning this type of intermarriage is as likely as endogamy.

A few things worth nothing:

  1. All of the least likely cases involve a Black partner, except for Black+Latino intermarriage.
  2. White/Latino is far the most likely combo, but only for Latino, Single Race.
  3. In general, Latino multiple race partners are less exogamous than Latino single race respondents.

For a better comparison across all cases, lets do a megaplot to get everything on the board at once:

Code
coef_short_sym |>
  mutate(variable=str_replace(variable, "\\.","+"),
         upper84=exp(coef+1.386*se),
         upper95=exp(coef+1.96*se),
         lower84=exp(coef-1.386*se),
         lower95=exp(coef-1.96*se),
         type=case_when(
           str_detect(variable, "Multi/Multi") ~ "Multi-to-Multi",
           str_count(variable, "/")>0 ~ "Multi-to-Mono",
           TRUE ~ "Mono-to-Mono"
         )) |>
  ggplot(aes(x=reorder(variable, coef, max), y=exp(coef), color=type))+
  geom_hline(yintercept=1, linewidth=0.5, color="grey30")+
  geom_linerange(linewidth=1.25,
                 aes(ymax=upper84, ymin=lower84))+
  geom_linerange(linewidth=0.5,
                 aes(ymax=upper95, ymin=lower95))+
  geom_point()+
  coord_flip()+
  scale_color_viridis_d(direction=-1, end=0.75)+
  theme_bw()+
  theme(legend.position = "bottom")+
  labs(x=NULL, 
       y="odds of interracial union relative to endogamy")
Figure 13: Later

Full Models

Code
htmlreg(lapply(list(model_full_sym_multi, model_short_sym_multi,
                      model_short_sym, model_short_asym), convertModel),
        digits=3,
        caption="Model predicting union formation",
        caption.above=TRUE)
Table 1: test
Model predicting union formation
  Model 1 Model 2 Model 3 Model 4
agediff 0.063*** 0.062*** 0.071*** 0.070***
  (0.006) (0.006) (0.000) (0.000)
agediff^2 -0.011*** -0.011*** -0.012*** -0.012***
  (0.001) (0.001) (0.000) (0.000)
hypergamyTRUE -0.080 -0.079 -0.047*** -0.036***
  (0.220) (0.209) (0.007) (0.007)
hypogamyTRUE 0.258 0.261 0.243*** 0.237***
  (0.157) (0.151) (0.008) (0.008)
edcross_hsTRUE -0.653*** -0.653*** -0.891*** -0.896***
  (0.162) (0.161) (0.008) (0.008)
edcross_scTRUE -0.565*** -0.564*** -0.674*** -0.676***
  (0.137) (0.136) (0.005) (0.006)
edcross_cTRUE -0.765*** -0.752*** -0.821*** -0.824***
  (0.141) (0.136) (0.006) (0.006)
birth_endogTRUE 0.344 0.352 0.412*** 0.416***
  (0.216) (0.227) (0.015) (0.015)
language_endogTRUE 1.603*** 1.576*** 1.422*** 1.426***
  (0.241) (0.251) (0.008) (0.008)
race_altWhite/Indigenous 0.234 0.293 0.956*** 0.959***
  (0.174) (0.172) (0.052) (0.053)
race_altWhite/Asian 0.012 0.100 0.851*** 0.853***
  (0.161) (0.149) (0.115) (0.117)
race_altBlack/Indigenous 1.014* 0.579* 1.466*** 1.468***
  (0.408) (0.245) (0.272) (0.274)
race_altBlack/Asian 0.768* 0.781* 1.743*** 1.751***
  (0.344) (0.359) (0.254) (0.262)
race_altIndigenous/Asian 0.548* 0.584** 1.022*** 1.029***
  (0.246) (0.220) (0.204) (0.203)
race_exog_full_symWhite/Black.White/Indigenous -2.148***      
  (0.174)      
race_exog_full_symWhite/Black.White/Asian -1.854***      
  (0.177)      
race_exog_full_symWhite/Black.Black/Indigenous -2.747***      
  (0.350)      
race_exog_full_symWhite/Black.Black/Asian -1.467**      
  (0.480)      
race_exog_full_symWhite/Black.Indigenous/Asian -3.033***      
  (0.768)      
race_exog_full_symWhite/Indigenous.White/Asian -1.440***      
  (0.123)      
race_exog_full_symWhite/Indigenous.Black/Indigenous -2.677***      
  (0.358)      
race_exog_full_symWhite/Indigenous.Black/Asian -3.094***      
  (0.574)      
race_exog_full_symWhite/Indigenous.Indigenous/Asian -1.526***      
  (0.286)      
race_exog_full_symWhite/Asian.Black/Indigenous -3.999***      
  (0.526)      
race_exog_full_symWhite/Asian.Black/Asian -2.148***      
  (0.473)      
race_exog_full_symWhite/Asian.Indigenous/Asian -2.166***      
  (0.350)      
race_exog_full_symBlack/Indigenous.Black/Asian -2.353***      
  (0.589)      
race_exog_full_symBlack/Indigenous.Indigenous/Asian -3.074*      
  (1.384)      
race_exog_full_symBlack/Asian.Indigenous/Asian -2.394*      
  (1.152)      
race_exog_short_symMulti/Multi, no shared ancestry   -3.266*** -3.157***  
    (0.380) (0.369)  
race_exog_short_symMulti/Multi, shared ancestry   -1.871*** -1.698***  
    (0.091) (0.144)  
race_altBlack     0.249*** 0.245***
      (0.011) (0.011)
race_altIndigenous     0.942*** 0.944***
      (0.031) (0.032)
race_altAsian     0.918*** 0.932***
      (0.026) (0.025)
race_altLatino     0.429*** 0.431***
      (0.009) (0.009)
race_altWhite/Black     0.827*** 0.827***
      (0.104) (0.107)
race_exog_short_symAsian.Black/Asian     -2.306***  
      (0.317)  
race_exog_short_symAsian.Black/Indigenous     -4.060***  
      (0.483)  
race_exog_short_symAsian.Indigenous/Asian     -1.782***  
      (0.334)  
race_exog_short_symAsian.Latino     -2.201***  
      (0.040)  
race_exog_short_symAsian.White/Asian     -1.386***  
      (0.157)  
race_exog_short_symAsian.White/Black     -2.639***  
      (0.169)  
race_exog_short_symAsian.White/Indigenous     -2.696***  
      (0.139)  
race_exog_short_symBlack.Asian     -3.250***  
      (0.055)  
race_exog_short_symBlack.Black/Asian     -1.886***  
      (0.287)  
race_exog_short_symBlack.Black/Indigenous     -1.914***  
      (0.261)  
race_exog_short_symBlack.Indigenous     -3.393***  
      (0.077)  
race_exog_short_symBlack.Indigenous/Asian     -3.051***  
      (0.333)  
race_exog_short_symBlack.Latino     -2.243***  
      (0.024)  
race_exog_short_symBlack.White/Asian     -3.273***  
      (0.157)  
race_exog_short_symBlack.White/Black     -1.469***  
      (0.120)  
race_exog_short_symBlack.White/Indigenous     -3.789***  
      (0.117)  
race_exog_short_symIndigenous.Asian     -3.011***  
      (0.146)  
race_exog_short_symIndigenous.Black/Asian     -4.285***  
      (0.747)  
race_exog_short_symIndigenous.Black/Indigenous     -3.048***  
      (0.421)  
race_exog_short_symIndigenous.Indigenous/Asian     -2.634***  
      (0.374)  
race_exog_short_symIndigenous.Latino     -2.189***  
      (0.063)  
race_exog_short_symIndigenous.White/Asian     -3.271***  
      (0.214)  
race_exog_short_symIndigenous.White/Black     -3.326***  
      (0.252)  
race_exog_short_symIndigenous.White/Indigenous     -2.743***  
      (0.126)  
race_exog_short_symLatino.Black/Asian     -2.447***  
      (0.282)  
race_exog_short_symLatino.Black/Indigenous     -2.665***  
      (0.306)  
race_exog_short_symLatino.Indigenous/Asian     -1.886***  
      (0.259)  
race_exog_short_symLatino.White/Asian     -1.521***  
      (0.092)  
race_exog_short_symLatino.White/Black     -1.533***  
      (0.125)  
race_exog_short_symLatino.White/Indigenous     -1.686***  
      (0.092)  
race_exog_short_symWhite.Asian     -1.625***  
      (0.021)  
race_exog_short_symWhite.Black     -3.102***  
      (0.014)  
race_exog_short_symWhite.Black/Asian     -3.031***  
      (0.273)  
race_exog_short_symWhite.Black/Indigenous     -3.533***  
      (0.312)  
race_exog_short_symWhite.Indigenous     -1.993***  
      (0.036)  
race_exog_short_symWhite.Indigenous/Asian     -1.710***  
      (0.234)  
race_exog_short_symWhite.Latino     -1.104***  
      (0.009)  
race_exog_short_symWhite.White/Asian     -1.161***  
      (0.102)  
race_exog_short_symWhite.White/Black     -1.780***  
      (0.106)  
race_exog_short_symWhite.White/Indigenous     -1.499***  
      (0.056)  
race_exog_short_asymAsian.Black       -4.213***
        (0.132)
race_exog_short_asymAsian.Black/Asian       -2.938***
        (0.426)
race_exog_short_asymAsian.Black/Indigenous       -5.553***
        (1.098)
race_exog_short_asymAsian.Indigenous       -3.206***
        (0.162)
race_exog_short_asymAsian.Indigenous/Asian       -1.967***
        (0.387)
race_exog_short_asymAsian.Latino       -2.449***
        (0.045)
race_exog_short_asymAsian.White       -2.166***
        (0.025)
race_exog_short_asymAsian.White/Asian       -1.782***
        (0.175)
race_exog_short_asymAsian.White/Black       -3.629***
        (0.261)
race_exog_short_asymAsian.White/Indigenous       -3.290***
        (0.213)
race_exog_short_asymBlack.Asian       -2.743***
        (0.079)
race_exog_short_asymBlack.Black/Asian       -1.583***
        (0.334)
race_exog_short_asymBlack.Black/Indigenous       -1.636***
        (0.275)
race_exog_short_asymBlack.Indigenous       -2.939***
        (0.088)
race_exog_short_asymBlack.Indigenous/Asian       -2.492***
        (0.349)
race_exog_short_asymBlack.Latino       -1.850***
        (0.036)
race_exog_short_asymBlack.White       -2.669***
        (0.015)
race_exog_short_asymBlack.White/Asian       -2.908***
        (0.164)
race_exog_short_asymBlack.White/Black       -1.227***
        (0.135)
race_exog_short_asymBlack.White/Indigenous       -3.333***
        (0.140)
race_exog_short_asymBlack/Asian.Asian       -1.905***
        (0.379)
race_exog_short_asymBlack/Asian.Black       -2.346***
        (0.398)
race_exog_short_asymBlack/Asian.Indigenous       -3.772***
        (0.963)
race_exog_short_asymBlack/Asian.Latino       -2.288***
        (0.299)
race_exog_short_asymBlack/Asian.White       -2.922***
        (0.279)
race_exog_short_asymBlack/Indigenous.Asian       -3.478***
        (0.473)
race_exog_short_asymBlack/Indigenous.Black       -2.274***
        (0.305)
race_exog_short_asymBlack/Indigenous.Indigenous       -2.644***
        (0.434)
race_exog_short_asymBlack/Indigenous.Latino       -2.429***
        (0.307)
race_exog_short_asymBlack/Indigenous.White       -3.402***
        (0.291)
race_exog_short_asymIndigenous.Asian       -2.858***
        (0.197)
race_exog_short_asymIndigenous.Black       -4.122***
        (0.128)
race_exog_short_asymIndigenous.Black/Asian       -5.050**
        (1.564)
race_exog_short_asymIndigenous.Black/Indigenous       -3.628***
        (0.632)
race_exog_short_asymIndigenous.Indigenous/Asian       -2.448***
        (0.458)
race_exog_short_asymIndigenous.Latino       -2.286***
        (0.085)
race_exog_short_asymIndigenous.White       -1.967***
        (0.049)
race_exog_short_asymIndigenous.White/Asian       -3.307***
        (0.308)
race_exog_short_asymIndigenous.White/Black       -3.636***
        (0.358)
race_exog_short_asymIndigenous.White/Indigenous       -2.546***
        (0.151)
race_exog_short_asymIndigenous/Asian.Asian       -1.607***
        (0.361)
race_exog_short_asymIndigenous/Asian.Black       -4.266***
        (0.738)
race_exog_short_asymIndigenous/Asian.Indigenous       -2.747***
        (0.729)
race_exog_short_asymIndigenous/Asian.Latino       -1.936***
        (0.267)
race_exog_short_asymIndigenous/Asian.White       -1.901***
        (0.224)
race_exog_short_asymLatino.Asian       -2.003***
        (0.051)
race_exog_short_asymLatino.Black       -2.846***
        (0.036)
race_exog_short_asymLatino.Black/Asian       -2.643***
        (0.354)
race_exog_short_asymLatino.Black/Indigenous       -3.031***
        (0.380)
race_exog_short_asymLatino.Indigenous       -2.100***
        (0.070)
race_exog_short_asymLatino.Indigenous/Asian       -1.842***
        (0.327)
race_exog_short_asymLatino.White       -1.098***
        (0.011)
race_exog_short_asymLatino.White/Asian       -1.598***
        (0.109)
race_exog_short_asymLatino.White/Black       -1.789***
        (0.131)
race_exog_short_asymLatino.White/Indigenous       -1.619***
        (0.108)
race_exog_short_asymMulti/Multi, no shared ancestry       -3.148***
        (0.369)
race_exog_short_asymMulti/Multi, shared ancestry       -1.700***
        (0.146)
race_exog_short_asymWhite.Asian       -1.290***
        (0.027)
race_exog_short_asymWhite.Black       -3.739***
        (0.023)
race_exog_short_asymWhite.Black/Asian       -3.161***
        (0.334)
race_exog_short_asymWhite.Black/Indigenous       -3.724***
        (0.391)
race_exog_short_asymWhite.Indigenous       -2.020***
        (0.037)
race_exog_short_asymWhite.Indigenous/Asian       -1.565***
        (0.274)
race_exog_short_asymWhite.Latino       -1.109***
        (0.011)
race_exog_short_asymWhite.White/Asian       -1.110***
        (0.091)
race_exog_short_asymWhite.White/Black       -1.991***
        (0.122)
race_exog_short_asymWhite.White/Indigenous       -1.456***
        (0.067)
race_exog_short_asymWhite/Asian.Asian       -1.084***
        (0.164)
race_exog_short_asymWhite/Asian.Black       -3.829***
        (0.231)
race_exog_short_asymWhite/Asian.Indigenous       -3.212***
        (0.343)
race_exog_short_asymWhite/Asian.Latino       -1.449***
        (0.106)
race_exog_short_asymWhite/Asian.White       -1.223***
        (0.127)
race_exog_short_asymWhite/Black.Asian       -2.022***
        (0.220)
race_exog_short_asymWhite/Black.Black       -1.878***
        (0.124)
race_exog_short_asymWhite/Black.Indigenous       -2.994***
        (0.344)
race_exog_short_asymWhite/Black.Latino       -1.285***
        (0.142)
race_exog_short_asymWhite/Black.White       -1.563***
        (0.105)
race_exog_short_asymWhite/Indigenous.Asian       -2.334***
        (0.153)
race_exog_short_asymWhite/Indigenous.Black       -4.483***
        (0.194)
race_exog_short_asymWhite/Indigenous.Indigenous       -2.954***
        (0.206)
race_exog_short_asymWhite/Indigenous.Latino       -1.753***
        (0.102)
race_exog_short_asymWhite/Indigenous.White       -1.545***
        (0.059)
Deviance 4019 4060 1581397 1577259
BIC (relative to null) -3909 -3966 -1867503 -1871095
***p < 0.001; **p < 0.01; *p < 0.05